package com.itrencai.d13_thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

//多线程的创建方式三：利用Callable、FutureTask接口实现
public class ThreadDemo3 {
    public static void main(String[] args) {
        //3.创建任务对象Collable
        Callable<String> call=new MyCallable(100);
            //4.把Callable任务对象交给futuretast对象
            //FutureTask对象的作用1：是Runnable的对象，可以交给Thread
            //FutureTask对象的作用2：可以在线程执行完毕之后调用其get方法得到线程执行完成的结果
            FutureTask<String> f1=new FutureTask<String>(call);
            //5.交给线程处理
            Thread t1=new Thread(f1);
            //6.启动线程
           t1.start();

        Callable<String> call2=new MyCallable(200);

        FutureTask<String> f2=new FutureTask<String>(call2);
        //5.交给线程处理
        Thread t2=new Thread(f2);
        //6.启动线程
        t2.start();

        try {
            //如果f1任务没有执行完毕，这里的代码会等待，直到线程1跑完才提取结果
            String rs1=f1.get();
            System.out.println("第一个结果："+rs1);
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            //如果f2任务没有执行完毕，这里的代码会等待，直到线程2跑完才提取结果
            String rs2=f1.get();
            System.out.println("第二个结果："+rs2);
        } catch (Exception e) {
            e.printStackTrace();
        }



    }

}
//1.定义一个任务类实现Colloble接口，应该声明线程任务执行完毕后的结果的数据类型

class MyCallable implements Callable<String>{
    private int n;
    public MyCallable(int n){
        this.n=n;
    }
    //2.重写call方法(线程任务方法)
    @Override
    public String call() throws Exception {
       int sum=0;
        for (int i = 1; i <=n; i++) {
            sum+=i;
        }
        return "子线程执行的结果是："+sum;
    }
}




